package linces

import (
	"crypto/rand"
	"crypto/sha256"
	"encoding/hex"
	"fmt"
	"net"
	"runtime"
	"strings"
)

// 判断是否为 VIP 地址（可以根据具体需求定义 VIP 地址范围）
func isVIP(ip net.IP) bool {
	// 示例：假设 VIP 地址在 192.168.1.0/24 范围内
	if ip.IsPrivate() && ip[0] == 192 && ip[1] == 168 {
		return true
	}
	return false
}

// GetMachineInfo 获取当前机器设备信息
func getMachineInfo() (string, error) {
	var machineInfo []string
	// 获取操作系统和cpu架构
	machineInfo = append(machineInfo, runtime.GOOS, runtime.GOARCH)
	// 获取网络接口信息
	interfaces, err := net.Interfaces()
	if err != nil {
		return "", err
	}
	for _, iface := range interfaces {
		// 忽略禁用的接口
		if iface.Flags&net.FlagUp == 0 {
			continue
		}
		// 获取 MAC 地址
		mac := iface.HardwareAddr
		if mac != nil {
			// 获取 IP 地址
			addrs, err := iface.Addrs()
			if err != nil {
				return "", err
			}
			for _, addr := range addrs {
				if ipNet, ok := addr.(*net.IPNet); ok {
					ip := ipNet.IP

					// 排除环回地址和 VIP 地址
					if ip.IsLoopback() || isVIP(ip) {
						continue
					}
					// 组合 MAC 和 IP 地址
					machineInfo = append(machineInfo, fmt.Sprintf("%s@%s", mac.String(), ip.String()))
				}
			}
		}
	}
	return strings.Join(machineInfo, ","), nil
}

// 根据设备信息，生成机器码
func generateMachineCode(machineInfo string) string {
	hasher := sha256.New()
	hasher.Write([]byte(machineInfo))
	return hex.EncodeToString(hasher.Sum(nil))
}

func GetMachineCode() string {
	var (
		machineInfo string
		err         error
		machineCode string
	)
	if machineInfo, err = getMachineInfo(); err != nil {
		return ""
	}
	machineCode = generateMachineCode(machineInfo)
	return machineCode
}

func GenerateRandomKey(size int) ([]byte, error) {
	key := make([]byte, size)
	_, err := rand.Read(key)
	if err != nil {
		return nil, err
	}
	// 检查密钥长度
	if len(key) != 16 && len(key) != 24 && len(key) != 32 {
		fmt.Println("Invalid key size:", len(key))
		return nil, err
	}
	return key, nil
}
